#include <iostream>
#include "lua.hpp"

// C++ 函数，将被 Lua 调用
int cpp_function(lua_State *L) {
    int arg = luaL_checkinteger(L, 1);
    std::cout << "C++ function called from Lua with argument: " << arg << std::endl;
    lua_pushinteger(L, arg * 2);  // 返回值
    return 1;  // 返回值的数量
}

int main() {
    lua_State *L = luaL_newstate();  // 创建一个新的 Lua 状态机
    luaL_openlibs(L);  // 打开所有标准 Lua 库

    // 注册 C++ 函数到 Lua
    lua_register(L, "cpp_function", cpp_function);

    // LUA -> C++
    // TEST01 执行一个简单的 Lua 脚本，调用 C++ 函数
    const char *lua_script = R"(
        print('Hello from Lua!')
        local result = cpp_function(10)
        print('Result from C++ function:', result)
    )";
    if (luaL_dostring(L, lua_script) != LUA_OK) {
        std::cerr << "Error: " << lua_tostring(L, -1) << std::endl;
        lua_pop(L, 1);  // 弹出错误消息
    }

    // TEST02 执行 Lua 脚本
    if (luaL_dofile(L, "hello.lua") != LUA_OK) {
        std::cerr << "Error: " << lua_tostring(L, -1) << std::endl;
        lua_pop(L, 1);  // 弹出错误消息
    }

    // c++ -> lua
    // 调用 Lua 函数
    lua_getglobal(L, "lua_function");
    lua_pushinteger(L, 5);
    // pcall 1个参数, 1个返回值, 0个错误处理函数
    if (lua_pcall(L, 1, 1, 0) != LUA_OK) {
        std::cerr << "Error: " << lua_tostring(L, -1) << std::endl;
        lua_pop(L, 1);  // 弹出错误消息
    } else {
        int result = lua_tointeger(L, -1);
        std::cout << "Result from Lua function: " << result << std::endl;
        lua_pop(L, 1);  // 弹出结果
    }

    lua_close(L);  // 关闭 Lua 状态机
    return 0;
}